package top.lishou.learnplat.service.impl;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import top.lishou.learnplat.entity.DataEntity;
import top.lishou.learnplat.mapper.DataMapper;
import top.lishou.learnplat.service.IDataService;

import javax.annotation.Resource;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class IDataServiceImpl implements IDataService {

    @Value("${server.ip}")
    private String ip;

    @Value("${server.port}")
    private String port;

    @Value("${server.filePath}")
    private String filePath;

    @Resource
    private DataMapper dataMapper;

    @Override
    @Transactional
    public String saveUploadedFile(MultipartFile data, String title) throws Exception {
        // 检查文件是否为空
        if (data.isEmpty()) {
            throw new Exception("上传文件为空，上传失败");
        }

        // 检查文件大小
        if (data.getSize() > 200 * 1024 * 1024) {
            throw new Exception("文件过大，上传失败");
        }

        // 获取文件原始名称
        String originalFilename = data.getOriginalFilename();
        // 获取文件后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        // 生成唯一文件名
        String uuidName = UUID.randomUUID().toString();
        // 定义文件最终的名字
        String fileName = uuidName + suffix;
        // 获取项目在服务器上的真实位置并拼凑文件最终的保存位置
        String realPath = filePath + fileName;
        // 创建目标文件
        File destFile = new File(realPath);
        // 确保上级目录存在
        File parentFile = destFile.getParentFile();
        if (!parentFile.exists()) {
            parentFile.mkdirs();
        }

        // 保存文件到磁盘
        data.transferTo(destFile);

        // 保存文件信息到数据库
        DataEntity dataEntity = new DataEntity();
        dataEntity.setD_title(title);
        dataEntity.setD_data(fileName); // 存储文件名
        dataEntity.setCreated_time(new Date());
        dataMapper.insert(dataEntity);

        // 返回文件访问路径
        return "http://" + ip + ":" + port + "/file/down/" + fileName;
    }

    @Override
    public byte[] getFileById(Integer fileId) throws Exception {
        // 从数据库中获取文件信息
        DataEntity dataEntity = dataMapper.selectById(fileId);
        if (dataEntity == null) {
            throw new Exception("文件不存在");
        }

        // 构建文件路径
        String realPath = filePath + dataEntity.getD_data();
        Path path = Paths.get(realPath);

        // 读取文件内容
        return Files.readAllBytes(path);
    }

    @Override
    public List<DataEntity> getAllFiles() {
        return dataMapper.selectAll();
    }

    @Override
    public DataEntity getDataById(Integer id) {
        return dataMapper.selectById(id);
    }
}